//package com.fyl.schedule;
//
//import org.quartz.*;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.scheduling.quartz.SchedulerFactoryBean;
//
//import java.util.Map;
//
//public class QuartzManager {
//
//    private Logger logger = LoggerFactory.getLogger(QuartzManager.class);
//
//    private static final String JOB_DEFAULT_GROUP_NAME = "JOB_DEFAULT_GROUP_NAME";
//
//    private static final String TRIGGER_DEFAULT_GROUP_NAME = "TRIGGER_DEFAULT_GROUP_NAME";
//
//    private SchedulerFactoryBean schedulerFactoryBean;
//
//    public QuartzManager(SchedulerFactoryBean schedulerFactoryBean) {
//        this.schedulerFactoryBean = schedulerFactoryBean;
//    }
//
//    /**
//     * 指定一些job启动
//     *
//     * @param jobMap to start job
//     */
//    public void startup(Map<Class<? extends Job>, String> jobMap) {
//        jobMap.forEach((clazz, cronExpression) -> {
//            if (clazz != null && cronExpression != null) {
//                addJob(clazz.getName(), clazz, cronExpression);
//            }
//        });
//        startup();
//    }
//
//    /**
//     * 启动
//     */
//    public void startup() {
//        if (!schedulerFactoryBean.isRunning()) {
//            schedulerFactoryBean.start();
//        }
//    }
//
//    /**
//     * 关闭
//     */
//    public void shutdown() {
//        try {
//            schedulerFactoryBean.destroy();
//            logger.info("quartz shutdown succeed.");
//        } catch (SchedulerException e) {
//            logger.error("quartz shutdown failed.", e);
//        }
//        logger.info("quartz shutdown finished.");
//    }
//
//    /**
//     * 获取Job状态
//     *
//     * @param jobName String
//     * @return Trigger.TriggerState
//     */
//    public Trigger.TriggerState getJobState(String jobName) {
//        try {
//            return schedulerFactoryBean.getScheduler().getTriggerState(buildTriggerKey(jobName));
//        } catch (SchedulerException e) {
//            logger.error(e.getMessage(), e);
//            logger.error("getJobState failed jobName:{}", jobName);
//            return Trigger.TriggerState.ERROR;
//        }
//    }
//
//    /**
//     * 检查Job是否存在
//     *
//     * @param jobName String
//     * @return boolean
//     */
//    public boolean checkExists(String jobName) {
//        JobKey jobKey = buildJobKey(jobName);
//        TriggerKey triggerKey = buildTriggerKey(jobName);
//        try {
//            return schedulerFactoryBean.getScheduler().checkExists(jobKey) && schedulerFactoryBean.getScheduler().checkExists(triggerKey);
//        } catch (SchedulerException e) {
//            logger.error(e.getMessage(), e);
//            logger.error("checkExists failed jobName:{}", jobName);
//            return false;
//        }
//    }
//
//
//    /**
//     * 添加Job
//     *
//     * @param jobName  String
//     * @param jobClass Class
//     * @param cronExp  corn 表达式
//     * @return boolean
//     */
//    public boolean addJob(String jobName, Class<? extends Job> jobClass, String cronExp) {
//        boolean result = false;
//        if (!CronExpression.isValidExpression(cronExp)) {
//            logger.error("Illegal cron expression format({})", cronExp);
//            return result;
//        }
//        try {
////            异步
////            Class clazz = "1".equals(job.getIsconcurrent()) ? QuartzJobFactory.class : QuartzJobFactoryDisallowConcurrentExecution.class;
////
////            JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(job.getJobname(), job.getJobgroup()).build();
////
////            jobDetail.getJobDataMap().put("scheduleJob", job);
////
////            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronexpression());
////
////            trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobname(), job.getJobgroup()).withSchedule(scheduleBuilder).build();
////
////            scheduler.scheduleJob(jobDetail, trigger);
//
//            JobDetail jobDetail = JobBuilder.newJob()
//                    .withIdentity(buildJobKey(jobName))
//                    .ofType(jobClass)
//                    .build();
//            Trigger trigger = TriggerBuilder.newTrigger()
//                    .forJob(jobDetail)
//                    .withSchedule(CronScheduleBuilder.cronSchedule(cronExp))
//                    .withIdentity(buildTriggerKey(jobName))
//                    .build();
//            schedulerFactoryBean.getScheduler().scheduleJob(jobDetail, trigger);
//            this.startup();
//            result = true;
//        } catch (Exception e) {
//            logger.error(e.getMessage(), e);
//            logger.error("QuartzManager add job failed");
//        }
//        return result;
//    }
//
//
//    /**
//     * 更新 Job
//     *
//     * @param jobName String
//     * @param cronExp corn 表达式
//     * @return boolean
//     */
//    public boolean updateJob(String jobName, String cronExp) {
//        boolean result = false;
//        if (!CronExpression.isValidExpression(cronExp)) {
//            logger.error("Illegal cron expression format({})", cronExp);
//            return result;
//        }
//        JobKey jobKey = buildJobKey(jobName);
//        TriggerKey triggerKey = buildTriggerKey(jobName);
//        try {
//            if (schedulerFactoryBean.getScheduler().checkExists(jobKey) && schedulerFactoryBean.getScheduler().checkExists(triggerKey)) {
//                JobDetail jobDetail = schedulerFactoryBean.getScheduler().getJobDetail(jobKey);
//                Trigger trigger = schedulerFactoryBean.getScheduler().getTrigger(triggerKey);
//                Trigger newTrigger = TriggerBuilder.newTrigger()
//                        .forJob(jobDetail)
//                        .withSchedule(CronScheduleBuilder.cronSchedule(cronExp))
//                        .withIdentity(buildTriggerKey(jobName))
//                        .build();
//                schedulerFactoryBean.getScheduler().rescheduleJob(triggerKey, newTrigger);
//                result = true;
//            } else {
//                logger.error("update job name:{},group name:{} or trigger name:{},group name:{} not exists..",
//                        jobKey.getName(), jobKey.getGroup(), triggerKey.getName(), triggerKey.getGroup());
//            }
//        } catch (SchedulerException e) {
//            logger.error(e.getMessage(), e);
//            logger.error("update job name:{},group name:{} failed!", jobKey.getName(), jobKey.getGroup());
//        }
//        return result;
//    }
//
//    /**
//     * 暂停 Job
//     *
//     * @param jobName String
//     */
//    public void pauseJob(String jobName) {
//        JobKey jobKey = buildJobKey(jobName);
//        try {
//            if (schedulerFactoryBean.getScheduler().checkExists(jobKey)) {
//                schedulerFactoryBean.getScheduler().pauseJob(jobKey);
//            } else {
//                logger.error("pause job name:{},group name:{} not exists.", jobKey.getName(), jobKey.getGroup());
//            }
//        } catch (SchedulerException e) {
//            logger.error(e.getMessage(), e);
//            logger.error("pause job name:{},group name:{} failed!", jobKey.getName(), jobKey.getGroup());
//        }
//    }
//
//
//    /**
//     * 恢复 Job
//     *
//     * @param jobName String
//     */
//    public void resumeJob(String jobName) {
//        JobKey jobKey = buildJobKey(jobName);
//        try {
//            if (schedulerFactoryBean.getScheduler().checkExists(jobKey)) {
//                schedulerFactoryBean.getScheduler().resumeJob(jobKey);
//            } else {
//                logger.error("pause job name:{},group name:{} not exists.", jobKey.getName(), jobKey.getGroup());
//            }
//        } catch (SchedulerException e) {
//            logger.error(e.getMessage(), e);
//            logger.error("pause job name:{},group name:{} failed!", jobKey.getName(), jobKey.getGroup());
//        }
//    }
//
//    /**
//     * 删除 Job
//     *
//     * @param jobName String
//     */
//    public boolean deleteJob(String jobName) {
//        boolean result = false;
//        JobKey jobKey = buildJobKey(jobName);
//        try {
//            if (schedulerFactoryBean.getScheduler().checkExists(jobKey)) {
//                result = schedulerFactoryBean.getScheduler().deleteJob(jobKey);
//            } else {
//                logger.error("delete job name:{},group name:{} not exists.", jobKey.getName(), jobKey.getGroup());
//            }
//        } catch (SchedulerException e) {
//            logger.error(e.getMessage(), e);
//            logger.error("delete job name:{},group name:{} failed!", jobKey.getName(), jobKey.getGroup());
//        }
//        return result;
//    }
//
//    private JobKey buildJobKey(String jobName) {
//        return new JobKey(jobName, JOB_DEFAULT_GROUP_NAME);
//    }
//
//    private TriggerKey buildTriggerKey(String jobName) {
//        return new TriggerKey(jobName, TRIGGER_DEFAULT_GROUP_NAME);
//    }
//
//}
